/*
 * jxUtils Project (2014)
 * 
 * by Denilson Edinaldo Pinto
 * 
 * LGPL
 * Copyright (C) 2014
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package org.jxUtils.check;

import java.util.Collection;
import java.util.Map;

/**
 * @author Denilson Edinaldo Pinto
 * @porject jxUtils
 * @package org.jxUtils.check
 * @date 08/02/2014 - 08:43:20
 */
public class CheckUtil {
	
	/**
	 * Verifica se o {@code value} está absolutamente vazia<br>
	 * <br>
	 * Caso o {@code value} esteja nulo, um {@link NullPointerException} será lançado
	 * 
	 * @param value
	 */
	public static final boolean isAbsoluteEmpty(final String value) {
	
		ParameterCheck.isNull(value, "value");
		
		return value.trim().isEmpty();
	}
	
	/**
	 * Verifica se o {@code value} está vazio<br>
	 * <br>
	 * Caso o {@code value} esteja nulo, um {@link NullPointerException} será lançado<br>
	 * <br>
	 * Tipos verificados:<br>
	 * <br>
	 * char,<br>
	 * boolean[], char[], byte[], short[], int[], long[], float[], double[], Object[]<br>
	 * {@link Character}, {@link CharSequence}, {@link Collection}, {@link Map}
	 * 
	 * @param value
	 */
	public static final boolean isEmpty(final Object value) {
	
		ParameterCheck.isNull(value, "value");
		
		//
		if(value instanceof boolean[]) {
			
			return ((boolean[])value).length == 0;
			
		}else if(value instanceof char[]) {
			
			return ((char[])value).length == 0;
			
		}else if(value instanceof byte[]) {
			
			return ((byte[])value).length == 0;
			
		}else if(value instanceof short[]) {
			
			return ((short[])value).length == 0;
			
		}else if(value instanceof int[]) {
			
			return ((int[])value).length == 0;
			
		}else if(value instanceof long[]) {
			
			return ((long[])value).length == 0;
			
		}else if(value instanceof float[]) {
			
			return ((float[])value).length == 0;
			
		}else if(value instanceof double[]) {
			
			return ((double[])value).length == 0;
			
		}else if(value.getClass().equals(char.class)) {
			
			return (char)value == '\0';
			
		}else if(value instanceof Character) {
			
			return ((Character)value).equals(new Character('\0'));
			
		}else if(value instanceof CharSequence) {
			
			return ((CharSequence)value).length() == 0;
			
		}else if(value instanceof Collection<?>) {
			
			return ((Collection<?>)value).size() == 0;
			
		}else if(value instanceof Map<?, ?>) {
			
			return ((Map<?, ?>)value).size() == 0;
			
		}else if(value.getClass().isArray()) {
			
			return ((Object[])value).length == 0;
			
		}else {
			
			return false;
		}
	}
	
	/**
	 * Verifica se o {@code value} não está absolutamente vazio<br>
	 * <br>
	 * Caso o {@code value} esteja nulo, um {@link NullPointerException} será lançado
	 * 
	 * @param value
	 */
	public static final boolean isNotAbsoluteEmpty(final String value) {
	
		return !isAbsoluteEmpty(value);
	}
	
	/**
	 * Verifica se o {@code value} não está vazio<br>
	 * <br>
	 * Caso o {@code value} esteja nulo, um {@link NullPointerException} será lançado
	 * 
	 * @param value
	 */
	public static final boolean isNotEmpty(final Object value) {
	
		return !isEmpty(value);
	}
	
	/**
	 * Verifica se o {@code value} não está nulo
	 * 
	 * @param value
	 */
	public static final boolean isNotNull(final Object value) {
	
		return !isNull(value);
	}
	
	/**
	 * Verifica se o {@code value} não está nulo e não está absolutamente vazio
	 * 
	 * @param value
	 */
	public static final boolean isNotNullAndNotAbsoluteEmpty(final String value) {
	
		return !isNullOrAbsoluteEmpty(value);
	}
	
	/**
	 * Verifica se o {@code value} não está nulo e não está vazio
	 * 
	 * @param value
	 */
	public static final boolean isNotNullAndNotEmpty(final Object value) {
	
		return !isNullOrEmpty(value);
	}
	
	/**
	 * Verifica se o {@code value} está nulo
	 * 
	 * @param value
	 */
	public static final boolean isNull(final Object value) {
	
		return value == null;
	}
	
	/**
	 * Verifica se o {@code value} está nulo ou absolutamente vazio
	 * 
	 * @param value
	 */
	public static final boolean isNullOrAbsoluteEmpty(final String value) {
	
		//
		if( !isNull(value)) {
			
			return isAbsoluteEmpty(value);
		}
		
		return true;
	}
	
	/**
	 * Verifica se o {@code value}  está nulo ou vazio
	 * 
	 * @param value
	 */
	public static final boolean isNullOrEmpty(final Object value) {
	
		//
		if( !isNull(value)) {
			
			return isEmpty(value);
		}
		
		return true;
	}
}
